package com.guyaogg.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 *
 * 1、整合 mybatis-plus
 *      1）导入依赖
 *          <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.4.3</version>
 *         </dependency>
 *      2）配置
 *          数据源:
 *              驱动
 *              在 yml 中配置数据源
 *          配置 mybatis-plus
 *              扫描 @MapperScan
 *              告诉 Mybatis-plus ，sql 映射文件位置
 * 2、逻辑删除
 *      标识删除位配置
 *      1.mybatis-plus:
 *          global-config:
 *            db-config:
 *              logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2,但是要加注解)
 *              logic-delete-value: 1 # 逻辑已删除值(默认为 1)
 *              logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
 *      2.@TableLogic
 * 3、JSR303 后端校验
 *      高版本 引入依赖
 *          <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-starter-validation</artifactId>
 *             <version>2.3.2.RELEASE</version>
 *         </dependency>
 *      1）给 Bean 添加校验注解  javax.validation.constraints
 *      2) 开启校验功能 @Validated
 *      3) 紧跟标注 BindingResult 就可以拿到校验结果的封装
 *      4) 分组校验  groups
 *         # @NotBlank(message = "品牌名不能为空",groups = {UpdateGroup.class,AddGroup.class})
 *         # @Validated(UpdateGroup.class) 指定分组处理
 *      5） 自定义校验
 *          编写一个自定义校验注解 ListValue
 *          自定义的校验器 ConstraintValidator
 *          管理校验器和校验注解
 * 4. 统一处理异常处理
 *
 * 5. 模板引擎
 *  1）thymeleaf-starter：关闭缓存（dev
 *  2）静态资源都放在 static 文件夹下，通过路径访问
 *  3）页面放在 templates 下，直接访问
 *
 * 6. 整合 redis
 *  1）引入依赖
 *  2）配置 host，port 等
 *  3）使用 SpringBoot 自动配置好的 StringRedisTemplate 来操作 redis
 * 7. 整合 redisson 作为分布式锁等功能框架
 *  1）引入依赖
 *  2）配置 redis
 * 8. 整合 SpringCache 减少缓存开发
 *  1）引入依赖、前提 redis 缓存
 *  2）写配置
 *      自动配置了哪些：会导入 redis 缓存框架的自动配置
 *              #1 配置了缓存管理器
 *              #2 配置使用 redis 作为缓存
 *          ## 即可使用 ：使用注解 @Cacheable、@CacheEvict、    @CachePut、      @Caching、@CacheConfig
 *                                 缓存保存    缓存删除  更新缓存（不影响方法执行） 组合操作  类级别共享缓存配置
 *            # @EnableCaching 开启缓存
 *  3）不足
 *         默认不支持锁结果，可能导致缓存击穿问题  sync 本地锁
 *         或者使用 分布式锁嵌套 ？？
 *
 *         常规数据（读多写少，即时性不高的）完全可以使用 它简化操作
 *
 *         特殊数据，特殊设计
 *
 *
 * @author guyao
 */
@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.guyaogg.gulimall.product.dao")
@EnableFeignClients(basePackages = "com.guyaogg.gulimall.product.feign")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
